﻿#pragma once
#include "core/command.h"
#include "core/typedefs.h"
namespace Commands
{
class IAudio;

/** \anchor Play
\brief Класс команды запуска проигрывания звука */
class Play : public Core::Command<IAudio>
{
public:
    /** \brief Конструктор по-умолчанию
    \details Звук будет проигрываться однократно в канале <i>0<\i> */
    Play(void);

    /** \brief Конструктор
    \param channel - номер канала в котором будет проиграться звук */
    Play(const int channel);

    /** \brief Деструктор */
    virtual ~Play();

private:
    friend class Core::Inspector;

    virtual void Accept(Core::Inspector& inspector);

    virtual Play* Copy(void) const;

    virtual float Execute(const float);

    virtual bool IsFinished(void) const;

 protected:
    /** \brief Номер канала звука */
    const int channel;
};
//-------------------------------------------------------------------------
/** \anchor Stop
\brief Класс команды остановки проигрывания звука */
class Stop : public Core::Command<IAudio>
{
public:
    /** \brief Конструктор */
    Stop();

    /** \brief Деструктор */
    virtual ~Stop();

private:
    friend class Core::Inspector;

    virtual void Accept(Core::Inspector& inspector);

    virtual Stop* Copy(void) const;

    virtual float Execute(const float);

    virtual bool IsFinished(void) const;
};
//-------------------------------------------------------------------------
/** \anchor PlayContinous
\brief Класс команды непрерывного проигрывания звука */
class PlayContinous : public Play
{
public:
    /** \brief Конструктор по-умолчанию
    \details Звук будет проигрываться в канале 0 неограниченно */
    PlayContinous(void);

    /** \brief Конструктор
     \param channel - номер канала в котором будет проигрываться звук */
    PlayContinous(const int channel);

    /** \brief Деструктор */
    virtual ~PlayContinous();

private:
    friend class Core::Inspector;

    virtual void Accept(Core::Inspector& inspector);

    virtual PlayContinous* Copy(void) const;

    virtual float Execute(const float );

    virtual bool IsFinished(void) const;
};
//-------------------------------------------------------------------------
/** \anchor FadeOut
\brief Класс команды плавного затухания проигрывающегося звука */
class FadeOut : public Core::Command<IAudio>
{
public:
    /** \brief Конструктор
    \param seconds - время (сек.) в течение которого звук должен затухнуть */
    FadeOut(float seconds);

    /** \brief Деструктор*/
    virtual ~FadeOut();

private:
    /** \brief Закрытый конструктор */
    FadeOut();

    friend class Core::Inspector;

    virtual void Accept(Core::Inspector& inspector);

    virtual FadeOut* Copy(void) const;

    virtual float Execute(const float);

    virtual bool IsFinished(void) const;

    /** \brief Время плавного затухания звука */
    const float seconds;
};
//-------------------------------------------------------------------------
}//Commands
